#ifndef __TASK_H_
#define __TASK_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <common.h>


// 任务状态（寄存器）
typedef struct REG
{
    U32             gs;
    U32             fs;
    U32             es;
    U32             ds;
    U32             edi;
    U32             esi;
    U32             ebp;
    U32             kesp;
    U32             ebx;
    U32             edx;
    U32             ecx;
    U32             eax;
    U32             eip;
    U32             cs;
    U32             eflags;
    U32             esp;
    U32             ss;
} REG;

// 任务
typedef struct TASK
{
    U32             id;                 // 任务 id
    U08*            name;               // 任务名称
    U08*            stack_addr;         // 任务栈基址
    U16             stack_size;         // 任务栈大小
    REG           reg;                // 任务上下文，即任务执行状态下所有寄存器的值
} TASK;


/******************************************************************************
* 函数名称: SwitchTo(TASK* task)
* 功能说明: 切换到任务 task 执行
* 输入参数: TASK*	task	--任务指针
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SwitchTo(TASK* task);

// 切换任务宏，其作用等同于 SwitchTo 函数
#define SWITCH_TO(t)    (void)({    \
    U32* pBase = (U32*)(&(t)->reg); \
    asm volatile(                   \
        "movl %0, %%esp\n"          \
        "popl %%gs\n"               \
        "popl %%fs\n"               \
        "popl %%es\n"               \
        "popl %%ds\n"               \
        "popal\n"                   \
        "iret\n"                    \
        :                           \
        : "r"(pBase)                \
        );}) 


#ifdef __cplusplus
}
#endif

#endif

